package cz.possoft.serializable.clovece.jaxb;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;

import cz.possoft.converter.jaxb.JAXBGameConverter;
import cz.possoft.generic.utils.GenericUtils;
import cz.possoft.serializable.clovece.game.CloveceGame;
import cz.possoft.serializable.clovece.jaxb.classes.CloveceGameType;
import cz.possoft.serializable.clovece.jaxb.classes.ObjectFactory;

/**
 * @author <a href="mailto:mposolda@gmail.com">Marek Posolda</a>
 */
public class CloveceJAXBGameConverter implements JAXBGameConverter<CloveceGame> 
{
   private static CloveceJAXBGameConverter instance = new CloveceJAXBGameConverter();
   
   private CloveceJAXBGameConverter()
   {      
   }
   
   public static CloveceJAXBGameConverter getInstance() 
   {
       return instance;
   }   

   public JAXBElement<?> convertGameToJAXBElement(CloveceGame game)
   {
      ObjectFactory oFactory = new ObjectFactory();
      CloveceGameType cloveceType = oFactory.createCloveceGameType();
      
      // Generic
      cloveceType.setWhitePlayerName(game.getWhitePlayerName());
      cloveceType.setBlackPlayerName(game.getBlackPlayerName());
      cloveceType.setWhiteNaTahu(game.isWhiteNaTahu());
      cloveceType.setMeWhite(game.isMeWhite());
      cloveceType.setGameBegin(game.isGameBegin());
      cloveceType.setActive(game.isActive());
      cloveceType.setEndState(game.isEndState());
      
      // Specific to Clovece
      int[] whiteLoc = game.getLocationOfPlayer(GenericUtils.COLOR_WHITE);
      int[] blackLoc = game.getLocationOfPlayer(GenericUtils.COLOR_BLACK);
      for (int i=0 ; i<4 ; i++)
      {
         cloveceType.getWhitePlayerLocations().add(whiteLoc[i]);
         cloveceType.getBlackPlayerLocations().add(blackLoc[i]);
      }      
      
      return oFactory.createCloveceGame(cloveceType);
   }

   public CloveceGame convertJAXBElementToGame(JAXBElement<?> element)
   {
      CloveceGameType cloveceType = (CloveceGameType)element.getValue();
      CloveceGame game = new CloveceGame();
      
      // Generic
      game.setNewGameState(cloveceType.getWhitePlayerName(), cloveceType.getBlackPlayerName(), cloveceType.isMeWhite());
      game.setWhiteNaTahu(cloveceType.isWhiteNaTahu());
      game.setGameBegin(cloveceType.isGameBegin());
      game.setActive(cloveceType.isActive());
      game.setEndState(cloveceType.isEndState());
      
      // Specific to Clovece
      int[] whiteLoc = new int[4];
      int[] blackLoc = new int[4];
      for (int i=0; i<4; i++)
      {
         whiteLoc[i] = cloveceType.getWhitePlayerLocations().get(i);
         blackLoc[i] = cloveceType.getBlackPlayerLocations().get(i);
      }
      game.setLocationOfPlayer(GenericUtils.COLOR_WHITE, whiteLoc);
      game.setLocationOfPlayer(GenericUtils.COLOR_BLACK, blackLoc);
      
      return game;
   }

   public JAXBContext getJAXBContext()
   {
      try 
      {
         return JAXBContext.newInstance("cz.possoft.serializable.clovece.jaxb.classes", CloveceJAXBGameConverter.class.getClassLoader());
      }
      catch (JAXBException je) 
      {
         je.printStackTrace();
         throw new RuntimeException("Can't create JAXB context.", je);
      }
   }

}

